Native Query হলো ডেটাবেস-স্পেসিফিক SQL স্টেটমেন্ট যা স্প্রিং ডেটা জেপিএ (Spring Data JPA)-তে ব্যবহৃত হয়। এটি ব্যবহার করে সরাসরি SQL স্টেটমেন্ট চালিয়ে ডেটাবেস থেকে ডেটা রিট্রাইভ বা আপডেট করা যায়। যখন JPQL (Java Persistence Query Language) বা JPA-এর ডিফল্ট পদ্ধতিতে কাঙ্ক্ষিত ফলাফল পাওয়া যায় না, তখন Native Query ব্যবহৃত হয়।
Native Query কি?
Native Query হলো ডেটাবেসে সরাসরি SQL কমান্ড চালানোর একটি পদ্ধতি। এটি JPA-এর @Query এনোটেশনের মাধ্যমে লেখা হয় এবং SQL কমান্ড সরাসরি ডেটাবেসে কার্যকর হয়।
বৈশিষ্ট্য
- ডেটাবেস স্পেসিফিক SQL ব্যবহার করা যায়।
- জটিল কুয়েরি, যেমন জয়েন (JOIN), সাব-কুয়েরি (Subquery) বা ডেটাবেস-স্পেসিফিক ফাংশন ব্যবহারের জন্য উপযোগী।
- ডিফল্ট JPA পদ্ধতির সীমাবদ্ধতা অতিক্রম করতে সাহায্য করে।
Native Query এর ব্যবহারের ধাপ
১. @Query এনোটেশন ব্যবহার
Native Query ডিফাইন করার জন্য @Query এনোটেশন ব্যবহার করতে হয় এবং nativeQuery = true প্যারামিটার সেট করতে হয়।
২. ডেটাবেস ফিল্ডের সাথে ম্যাপিং নিশ্চিত করা
Native Query থেকে প্রাপ্ত ফলাফল Entity ক্লাস বা কাস্টম অবজেক্টের সাথে সঠিকভাবে ম্যাপ করতে হবে।
উদাহরণ
Entity ক্লাস
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class User {
@Id
private Long id;
private String name;
private String email;
// Getter এবং Setter
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
Repository ইন্টারফেস
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface UserRepository extends JpaRepository<User, Long> {
// Native Query উদাহরণ
@Query(value = "SELECT * FROM user WHERE name = :name", nativeQuery = true)
List<User> findUsersByName(@Param("name") String name);
// Native Query এর মাধ্যমে নির্দিষ্ট ফিল্ড রিট্রাইভ করা
@Query(value = "SELECT email FROM user WHERE id = :id", nativeQuery = true)
String findEmailById(@Param("id") Long id);
}
Controller
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping("/by-name/{name}")
public List<User> getUsersByName(@PathVariable String name) {
return userRepository.findUsersByName(name);
}
@GetMapping("/email/{id}")
public String getEmailById(@PathVariable Long id) {
return userRepository.findEmailById(id);
}
}
Native Query এর সুবিধা
- ডেটাবেস স্পেসিফিক ফিচার সমর্থন করে: সাব-কুয়েরি, জটিল জয়েন এবং কাস্টম ফাংশনের ব্যবহার সহজ করে।
- জটিল কুয়েরি পরিচালনা: যখন JPQL বা ডিফল্ট JPA পদ্ধতিতে সীমাবদ্ধতা থাকে, তখন Native Query ব্যবহার করা হয়।
- উন্নত পারফরম্যান্স: নির্দিষ্ট কিছু ক্ষেত্রে এটি দ্রুততর হতে পারে কারণ এটি সরাসরি ডেটাবেস SQL ব্যবহার করে।
Native Query এর সীমাবদ্ধতা
- ডেটাবেস ডিপেন্ডেন্ট: এটি নির্দিষ্ট ডেটাবেসের জন্য তৈরি, তাই ডেটাবেস পরিবর্তনের সময় কুয়েরি আপডেট করতে হয়।
- কোডের জটিলতা বৃদ্ধি: SQL স্টেটমেন্ট সরাসরি কোডে লেখার ফলে কোড মেইনটেনেন্স কঠিন হতে পারে।
- টাইপ সেফটি অনুপস্থিত: Native Query টাইপ সেফ নয়, ফলে রUNTIME ত্রুটি ঘটার সম্ভাবনা বেশি।
Native Query বনাম JPQL
| বৈশিষ্ট্য | Native Query | JPQL |
|---|---|---|
| লেখার ধরন | ডেটাবেস স্পেসিফিক SQL | জাভা অবজেক্ট ভিত্তিক JPA ল্যাঙ্গুয়েজ |
| ডেটাবেস নির্ভরতা | ডেটাবেস নির্ভর | ডেটাবেস ইন্ডিপেন্ডেন্ট |
| ব্যবহারিক ক্ষেত্র | জটিল SQL স্টেটমেন্ট এবং ডেটাবেস ফাংশন | সাধারণ ডেটা ফিল্টারিং এবং রিলেশন ম্যানেজমেন্ট |
| পারফরম্যান্স | নির্দিষ্ট ক্ষেত্রে দ্রুত | সাধারণত ডেটাবেস নির্ভর নয়, তাই কিছুটা ধীর |
সারমর্ম
Native Query স্প্রিং বুট ORM-এ এমন একটি গুরুত্বপূর্ণ টুল যা ডেটাবেসের জটিল কুয়েরি পরিচালনা করতে ব্যবহৃত হয়। এটি সরাসরি SQL স্টেটমেন্ট ব্যবহার করে কাজ করায় ডেটাবেস স্পেসিফিক ফিচার কাজে লাগানো যায়। তবে এটি ব্যবহারের সময় ডেটাবেস নির্ভরতা এবং কোড মেইনটেনেন্সের বিষয়গুলো বিবেচনায় রাখতে হবে।
Read more